Data Science,
Séance 7 : Visualisation avec ggplot

Etienne Côme

21 novembre 2018

Visualiser

=

encoder dans des

variables graphiques

les données

Variables graphiques

Bertin Jacques, Sémiologie graphique, Paris, Mouton/Gauthier-Villars, 1967.

Variables graphiques

Bertin Jacques, Sémiologie graphique, Paris, Mouton/Gauthier-Villars, 1967.

Variables graphiques, marques

Variables graphiques, marques

Toutes les variables graphiques ne se valent pas.

Variables graphiques, marques

Choisir une variable graphique adapté aux type de la variable représenté

Variables graphiques, marques

Ce quio est intéressant n’est pas toujours ce que l’on a au départ.

library(ggplot2)
ggplot(mpg)+geom_point(aes(x=cty,y=hwy,color=class))

Questions ? type des variables ?

continues ? discrètes ? ordonnées ? temporelles ? spatiales ?

Des catégories

et

une quantité pour chaque catégorie

le bar chart

le bar chart

library(rjson)
library(dplyr)
?mpg

dataset mpg

  • manufacturer.

  • model.

  • displ. engine displacement, in litres

le bar chart

m_cty = mpg %>% group_by(manufacturer) %>% summarize(mcty=mean(cty))
ggplot(data=m_cty)+
  geom_bar(aes(x=manufacturer,y=mcty),stat = 'identity')+
  scale_x_discrete("Manufacturer")+
  scale_y_continuous("Miles / Gallon (City conditions)")

Ordre ?

m_cty_ordered = m_cty %>% arrange(desc(mcty)) %>% 
  mutate(manufacturer=factor(manufacturer,levels=manufacturer))
ggplot(data=m_cty_ordered)+
  geom_bar(aes(x=manufacturer,y=mcty),stat = 'identity')+
  scale_x_discrete("Manufacturer")+
  scale_y_continuous("Miles / Gallon (City conditions)")

Horizontal ?

ggplot(data=m_cty_ordered)+
  geom_bar(aes(x=manufacturer,y=mcty),stat = 'identity')+
  scale_x_discrete("Manufacturer")+
  scale_y_continuous("Miles / Gallon (City conditions)")+
  coord_flip()

La ligne :

1 variable numérique

en fonction du

temps

Données Vélib’ aggrégées :

url="http://vlsstats.ifsttar.fr/data/temporalstats_NewYork.json"
# lecture des données
data=fromJSON(file=url)
# construction d'une liste de data.frame homogènes
tempstats.list=lapply(data,function(x){
  data.frame(time=x$'_id',nbbikes=x$value$total_available_bikes)})
# concatenations des data.frame ?do.call
tempstats.df=do.call(rbind,tempstats.list)

Ordre naturel imposé par le temps

ggplot(data=tempstats.df,aes(x=time,y=nbbikes))+geom_point()

Ordre naturel imposé par le temps

ggplot(data=tempstats.df,aes(x=time,y=nbbikes))+geom_line()

Aspect ratio

ggplot(data=tempstats.df,aes(x=time,y=nbbikes))+geom_line()

Aspect ratio

ggplot(data=tempstats.df,aes(x=time,y=nbbikes))+geom_line()

Aspect ratio

ggplot(data=tempstats.df,aes(x=time,y=nbbikes))+geom_line()

Aspect ratio, 45°

Heuristic: use the aspect ratio that results in an average line slope of 45°.

Cleveland, William S., Marylyn E. McGill, and Robert McGill. “The shape parameter of a two-variable graph.” Journal of the American Statistical Association 83.402 (1988): 289-300.

Aire + Echelle

ggplot(data=tempstats.df,aes(x=time,y=nbbikes))+geom_area()

Changement de point de vue

ggplot(data=tempstats.df,aes(x=time,y=max(nbbikes)-nbbikes))+
  geom_area()

1 variable numérique

en fonction du

temps

+ catégories

Données Vélib par stations

# téléchargement et remise en forme des données
url = "http://vlsstats.ifsttar.fr/data/spatiotemporalstats_NewYork.json"
data=fromJSON(file=url)
extract = function(x){
  data.frame(id=x$'_id',
             time= x$download_date,
             nbbikes = x$available_bikes )
  }
st_tempstats.df=do.call(rbind,lapply(data,extract))
# selection de 3 stations
st_tempstats_sub.df = st_tempstats.df %>% 
  filter(id %in% c(397,398,3637,474,525,2000,401))

Line charts superposés

ggplot(data=st_tempstats_sub.df)+
  geom_line(aes(x=time,y=nbbikes,group=id,color=factor(id)),size=2)

Small multiples

ggplot(data=st_tempstats_sub.df)+
  geom_line(aes(x=time,y=nbbikes,group=id,color=factor(id)),size=2)+
  facet_grid(id ~ .)

2 variables numériques

+ catégories

Scatter plot + colors

mpg_su = mpg %>% 
  filter(class %in% c('compact','suv','pickup','minivan')) 
ggplot(mpg_su)+geom_point(aes(x=cty,y=hwy,color=class))

Scatter plot + symbols

mpg_su = mpg %>% 
  filter(class %in% c('compact','suv','pickup','minivan')) 
ggplot(mpg_su)+geom_point(aes(x=cty,y=hwy,shape=class))

3 variables numériques (dont une >0)

+ catégories

Scatter plot + couleur + taille

ggplot(mpg_su)+geom_point(aes(x=cty,y=hwy,color=class,size=displ))

Scatter plot + couleur + taille ! echelles

ggplot(mpg_su)+geom_point(aes(x=cty,y=hwy,color=class,size=displ))

Taille des cercles : échelle aire ou rayon ?

Rayon

Aire

Principes :

Eviter de mentir,
Lie Factor

\[\textrm{Lie factor} = \frac{\textrm{visual effect size}}{\textrm{data effect size}}\]

Lie factor :

\[\textrm{data effect size} = \frac{27.5 - 18}{18} \times 100 = 53 \%\]

Edward Tufte, The Visual Display of Quantitative Information, Cheshire, CT, Graphics Press, 2001, 2e éd. (1re éd. 1983)

Lie factor :

\[\textrm{visual effect size} = \frac{5.3 -0.6}{0.6} \times 100 = 783 \%\]

Edward Tufte, The Visual Display of Quantitative Information, Cheshire, CT, Graphics Press, 2001, 2e éd. (1re éd. 1983)

Lie factor :

\[\textrm{Lie factor} = \frac{783}{53} = 14.8\]

Edward Tufte, The Visual Display of Quantitative Information, Cheshire, CT, Graphics Press, 2001, 2e éd. (1re éd. 1983)

Lie factor : 9.4

Edward Tufte, The Visual Display of Quantitative Information, Cheshire, CT, Graphics Press, 2001, 2e éd. (1re éd. 1983)

Sachant que l’aire de la tranche “apple”" (en vert) est proportionelle à \(2.22\,cm^2\) et celle correspondant à rim (en bleue) est proportionelle à \(2.96\,cm^2\) calculer le lying factor ?

Principes :

Augmenter la densité de données

\[\textrm{graph data density} = \frac{\textrm{number of entries in data matrix}}{\textrm{area of data display}}\]

Data density :

Eviter les graphique à faible densité

Edward Tufte, The Visual Display of Quantitative Information, Cheshire, CT, Graphics Press, 2001, 2e éd. (1re éd. 1983)

Data density :

Meilleure densité de donnée

Edward Tufte, The Visual Display of Quantitative Information, Cheshire, CT, Graphics Press, 2001, 2e éd. (1re éd. 1983)

Bonnes pratiques :

  • éviter de mentir !
  • faire des graphiques riches
  • avec des encodages adaptés
  • de bonnes échelles, (!couleurs, !aires)
  • des axes labelisés
  • ordre des facteurs
  • aspect ratio
  • format d’enregistrements pdf, svg // png,jpg

ggplot

gg = grammar of graphics

  • “The Grammar of Graphics” (Wilkinson, Annand and Grossman, 2005)
  • grammaire → même type de description pour des graphique différents

ggplot

Composants de la grammaires :

  • data and aesthetic mappings,
    ex : f(data) → x position, y position, size, shape, color
  • geometric objects,
    ex : points, lines, bars, texts
  • scales,
    ex : f([0, 100]) → [0, 5] px
  • facet specification,
    ex : segmentation des données suivant un ou plusieurs facteurs
  • statistical transformations,
    ex : moyenne, comptage, régression
  • the coordinate system.
  • ggplot

    Création d’un graphique :

  • ajout successif de layers (calques)
  • définissant un mapping des données vers leurs représentation
  • (+ optionel) définition de transformations statistique
  • (+ optionel) définition des échelles
  • (+ optionel) gestion du thème des titre …

    ! Données toujours sous forme de data.frame bien formatées

  • ggplot, géométries

    Création d’un graphique :

  • ajout successif de layers (calques)
    +geom_line()
  • définissant un mapping des données vers leurs représentation
    aes(x=a,y=b,...)

    Exemple

    
    ggplot(mpg)+
      geom_point(aes(x=cty,y=hwy,color=manufacturer,shape=factor(cyl)))
    ggplot(mpg,aes(x=cty,y=hwy,color=manufacturer,shape=factor(cyl)))+
      geom_jitter()
    

  • ggplot

    ggplot(mpg,aes(x=cty,y=hwy,color=manufacturer))+geom_point()

    ggplot

    ggplot(mpg,aes(x=cty,y=hwy,color=manufacturer))+geom_jitter()

    ggplot

    ggplot(mpg,aes(x=cty,fill=manufacturer))+geom_histogram(binwidth=2)

    ggplot

    ggplot(mpg,aes(y=cty,x=manufacturer))+geom_violin()

    ggplot, échelles

    Création d’un graphique :

  • ajout successif de layers (calques)
    +geom_line()
  • définissant un mapping des données vers leurs représentation
    aes(x=a,y=b,...)
  • en fixant les échelles
    scale_fill_brewer(palette=3,type="qual")
    scale_x_continuous(limits=c(0,45),breaks=seq(0,45,2))
  • ggplot, échelles

    ggplot(mpg,aes(x=cty,y=hwy,color=manufacturer,shape=factor(cyl)))+
      geom_jitter()+
      scale_x_continuous(limits=c(0,45),breaks=seq(0,45,2))

    Echelles
    de
    couleurs

    Echelle de couleurs

    http://colorbrewer2.org/

    ggplot, facettes

    Création d’un graphique :

  • ajout successif de layers (calques)
    +geom_line()
  • définissant un mapping des données vers leurs représentation
    aes(x=a,y=b,...)
  • en fixant les échelles
    scale_fill_brewer(palette=3,type="qual")
    scale_x_continuous(limits=c(0,45),breaks=seq(0,45,2))
  • en créant des facettes
    facet_grid(. ~ cyl)
  • ggplot, facettes

    ggplot(data=mpg,aes(x=hwy,y=cty,color=class))+
      geom_point()+
      facet_wrap(~year)

    ggplot, stats

    Création d’un graphique :

  • ajout successif de layers (calques)
    +geom_line()
  • définissant un mapping des données vers leurs représentation
    aes(x=a,y=b,...)
  • en fixant les échelles
    scale_fill_brewer(palette=3,type="qual")
    scale_x_continuous(limits=c(0,45),breaks=seq(0,45,2))
  • en ajoutant des stats
    stat_density2d()
  • ggplot

    ggplot(mpg,aes(y=cty,x=hwy))+
      geom_point(color="blue")+stat_density2d()

    ggplot

    ggplot(mpg,aes(y=cty,x=hwy))+
      geom_point(color="blue")+stat_smooth()

    ggplot

    library(hexbin)
    ggplot(mpg,aes(y=cty,x=hwy))+
      stat_binhex()

    Exercices

    Reprendre les échelles, légendes de cette figures

    # téléchargement et remise en forme des données
    url="http://vlsstats.ifsttar.fr/data/spatiotemporalstats_NewYork.json"
    data=fromJSON(file=url)
    extract = function(x){
      data.frame(id=x$'_id',
                 time= x$download_date,
                 nbbikes = x$available_bikes )
      }
    st_tempstats.df=do.call(rbind,lapply(data,extract))
    # selection de 3 stations
    st_tempstats_sub.df = st_tempstats.df %>% 
      filter(id %in% c(397,398,3637,474,525,2000,401))
    ggplot(data=st_tempstats_sub.df)+
      geom_line(aes(x=time,y=nbbikes,group=id,color=factor(id)),size=2)+
      facet_grid(id ~ .)

    Exercices

    Reprendre les échelles, légendes de cette figures

    Exercices

    Reproduire ce graphique (Les données Iris sont déjà chargées)

    Exercices

    Reproduire ce graphique (Les données mtcars sont déjà chargées) ! modifier le theme du graphique ?theme

    Exercices

    Reproduire ce graphique

    Exercices

    Reproduire ce graphique Informations supplémentaires :
    • Données Vélib de New York
    • Calculer le taux de remplissage / max(velos disponnibles)
    • passer en format large
    • k-means en 8 classes Matrixe X (lignes = stations, colonnes = pas de temps)
    • facet + courbes moyennes + transparence (alpha)